﻿#ifndef DIRECTION_H
#define DIRECTION_H
#include <iostream>
using namespace std;

class Direction
{
public:
    /*
     * Function: merge
     * Summary: 依据方向移动和合并棋盘中的数据
     * Input: arr为获取棋盘现有的数据
     * Output: 返回值为本次合并获得的分数
     */
    virtual int merge(int** arr)=0;

    /*
     * Function: generateNum
     * Summary: 依据空位产生一个随机数
     * Input: arr为获取棋盘的数据布局
     * Output: 返回值为随机数产生是否成功标志
     */
    virtual bool generateNum(int** arr)=0;

    /*
     * Function: getDataChanged
     * Summary: 获取成员变量dataChanged的值
     * Input: void
     * Output: 返回值为成员变量dataChanged的值
     */
    virtual bool getDataChanged()=0;

    /*
     * Function: getCombo
     * Summary: 获取成员变量combo的值
     * Input: void
     * Output: 返回值为成员变量combo的值
     */
    virtual int getCombo()=0;

protected:

    //Summary: 检测新旧状态是否变化，如果没有变化，不产生随机数
    bool dataChanged;

    //Summary: 记录移动和合并后，每行或列有多少个数字，方便生成随机数
    int numEachLine[4];

    //Summary: 记录单次移动所合并的数字对数
    int combo;
};

class Up : public Direction
{
public:
    /*
     * Function: Up
     * Summary: 构造函数，用于初始化成员变量dataChanged,numEachLine和combo
     * Input: void
     * Output: void
     */
    Up();

    /*
     * Function: merge
     * Summary: 向上移动和合并棋盘中的数据
     * Input: arr为获取棋盘现有的数据
     * Output: 返回值为本次合并获得的分数
     */
    int merge(int** arr);

    /*
     * Function: generateNum
     * Summary: 依据空位产生一个随机数
     * Input: arr为获取棋盘的数据布局
     * Output: 返回值为随机数产生是否成功标志
     */
    bool generateNum(int** arr);

    /*
     * Function: getDataChanged
     * Summary: 获取成员变量dataChanged的值
     * Input: void
     * Output: 返回值为成员变量dataChanged的值
     */
    bool getDataChanged();

    /*
     * Function: getCombo
     * Summary: 获取成员变量combo的值
     * Input: void
     * Output: 返回值为成员变量combo的值
     */
    int getCombo();
};

class Down : public Direction
{
public:
    /*
     * Function: Down
     * Summary: 构造函数，用于初始化成员变量dataChanged,numEachLine和combo
     * Input: void
     * Output: void
     */
    Down();

    /*
     * Function: merge
     * Summary: 向下移动和合并棋盘中的数据
     * Input: arr为获取棋盘现有的数据
     * Output: 返回值为本次合并获得的分数
     */
    int merge(int** arr);

    /*
     * Function: generateNum
     * Summary: 依据空位产生一个随机数
     * Input: arr为获取棋盘的数据布局
     * Output: 返回值为随机数产生是否成功标志
     */
    bool generateNum(int** arr);

    /*
     * Function: getDataChanged
     * Summary: 获取成员变量dataChanged的值
     * Input: void
     * Output: 返回值为成员变量dataChanged的值
     */
    bool getDataChanged();

    /*
     * Function: getCombo
     * Summary: 获取成员变量combo的值
     * Input: void
     * Output: 返回值为成员变量combo的值
     */
    int getCombo();
};

class Left : public Direction
{
public:
    /*
     * Function: Left
     * Summary: 构造函数，用于初始化成员变量dataChanged,numEachLine和combo
     * Input: void
     * Output: void
     */
    Left();

    /*
     * Function: merge
     * Summary: 向左移动和合并棋盘中的数据
     * Input: arr为获取棋盘现有的数据
     * Output: 返回值为本次合并获得的分数
     */
    int merge(int** arr);

    /*
     * Function: generateNum
     * Summary: 依据空位产生一个随机数
     * Input: arr为获取棋盘的数据布局
     * Output: 返回值为随机数产生是否成功标志
     */
    bool generateNum(int** arr);

    /*
     * Function: getDataChanged
     * Summary: 获取成员变量dataChanged的值
     * Input: void
     * Output: 返回值为成员变量dataChanged的值
     */
    bool getDataChanged();

    /*
     * Function: getCombo
     * Summary: 获取成员变量combo的值
     * Input: void
     * Output: 返回值为成员变量combo的值
     */
    int getCombo();
};

class Right : public Direction
{
public:

    /*
     * Function: Right
     * Summary: 构造函数，用于初始化成员变量dataChanged,numEachLine和combo
     * Input: void
     * Output: void
     */
    Right();

    /*
     * Function: merge
     * Summary: 向右移动和合并棋盘中的数据
     * Input: arr为获取棋盘现有的数据
     * Output: 返回值为本次合并获得的分数
     */
    int merge(int** arr);

    /*
     * Function: generateNum
     * Summary: 依据空位产生一个随机数
     * Input: arr为获取棋盘的数据布局
     * Output: 返回值为随机数产生是否成功标志
     */
    bool generateNum(int** arr);

    /*
     * Function: getDataChanged
     * Summary: 获取成员变量dataChanged的值
     * Input: void
     * Output: 返回值为成员变量dataChanged的值
     */
    bool getDataChanged();

    /*
     * Function: getCombo
     * Summary: 获取成员变量combo的值
     * Input: void
     * Output: 返回值为成员变量combo的值
     */
    int getCombo();
};

#endif // DIRECTION_H
